package pers.sloera.leetcode.editor.cn;//给定一个字符串数组 words，请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时，它们长度的乘积的最大值。假设字符串中只包含英语
//的小写字母。如果没有不包含相同字符的一对字符串，返回 0。 
//
// 
//
// 示例 1: 
//
// 
//输入: words = ["abcw","baz","foo","bar","fxyz","abcdef"]
//输出: 16 
//解释: 这两个单词为 "abcw", "fxyz"。它们不包含相同字符，且长度的乘积最大。 
//
// 示例 2: 
//
// 
//输入: words = ["a","ab","abc","d","cd","bcd","abcd"]
//输出: 4 
//解释: 这两个单词为 "ab", "cd"。 
//
// 示例 3: 
//
// 
//输入: words = ["a","aa","aaa","aaaa"]
//输出: 0 
//解释: 不存在这样的两个单词。
// 
//
// 
//
// 提示： 
//
// 
// 2 <= words.length <= 1000 
// 1 <= words[i].length <= 1000 
// words[i] 仅包含小写字母 
// 
//
// 
//
// 注意：本题与主站 318 题相同：https://leetcode-cn.com/problems/maximum-product-of-word-
//lengths/ 
// Related Topics 位运算 数组 字符串 👍 55 👎 0


// leetcode submit region begin(Prohibit modification and deletion)
// class Solution {
class SolutionII005 {
    //   public static void main(String[] args) {
    //     final SolutionII005 solutionII005 = new SolutionII005();
    //     final int i = solutionII005.maxProduct(new String[]{"abcw", "baz", "foo", "bar", "fxyz", "abcdef"});
    //     Assert.isTrue(17 == i);
    //   }

    public int maxProduct(String[] words) {
        final int[] masks = new int[words.length];
        for (int i = 0; i < words.length; i++) {
            masks[i] = 0;
            int finalI = i;
            words[i].chars().map(x -> x - 'a').forEach(x -> masks[finalI] = masks[finalI] | 1 << x);
        }
        int result = 0;
        for (int i = 0; i < words.length - 1; i++) {
            for (int j = i + 1; j < words.length; j++) {
                if (0 == (masks[i] & masks[j])) {
                    result = Math.max(result, words[i].length() * words[j].length());
                }
            }
        }
        return result;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
